约瑟夫环 (队列实现)

#include "stdio.h"
#include<stdlib.h>
#define MAXQSIZE 100
#define TRUE 1
#define OK 1
#define FALSE 0
#define OVERFLOW 0

typedef struct{
    int  *elem;   
int front;     //队头指针
int rear;      //队尾指针
}SeQueue;

void Init_SeQueue(SeQueue *sq)
{
    sq->elem = (int*)malloc(MAXQSIZE * sizeof(int));
	sq->front=sq->rear=0;
 }
int Empty_SeQueue(SeQueue *sq)
{
	return sq->front == sq->rear;
}
int In_SeQueue(SeQueue *sq, int x)
{
	if ((sq->rear+1)%MAXQSIZE == sq->front)
	{
		printf("队满");
		return 0;
	}
	sq->elem[sq->rear] = x;
	sq->rear = (sq->rear+1)%MAXQSIZE;
	return 1;
}
int  Out_SeQueue (SeQueue *sq, int *y)
{
	if (Empty_SeQueue(sq))
	{
		printf("队空");
		return 0;
	}
	*y = sq->elem[sq->front];
	sq->front = (sq->front+1)%MAXQSIZE;
	return 1;
}

main()
{
	SeQueue sq;
	int i,j,k,y,n,m,cnt=0;
	Init_SeQueue(&sq);
	scanf("%d%d",&n,&m);
	for (i=1; i<=n; i++)
	{
		In_SeQueue(&sq, i);
	}
	while(!Empty_SeQueue(&sq))
	{
		cnt++;
		if (cnt != m)
		{
			Out_SeQueue(&sq, &y);
			In_SeQueue(&sq, y);
		}
		else
		{
			Out_SeQueue(&sq, &y);
			printf("%d",y);
			cnt=0;
		}
	}
}

约瑟夫环是一个经典的问题,它描述了一群人围成一个环,每次数到指定的数字就出圈,直到只剩下一个人为止。这个问题可以用队列来模拟。 以下是使用C语言实现约瑟夫环队列形式的示例代码: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; struct Node* next; } Node, *Queue; // 初始化队列 void initQueue(Queue* Q) { *Q = (Queue) malloc(sizeof(Node)); (*Q)->next = *Q; } // 入队 void enQueue(Queue Q, int data) { Node* newNode = (Node*) malloc(sizeof(Node)); newNode->data = data; newNode->next = Q->next; Q->next = newNode; Q = newNode; } // 出队 int deQueue(Queue Q) { if (Q->next == Q) { // 队列为空 printf("Queue is empty!\n"); return -1; } Node* p = Q->next->next; int data = p->data; Q->next->next = p->next; if (p == Q) { Q = Q->next; } free(p); return data; } // 约瑟夫环 void josephus(int n, int m) { Queue Q; initQueue(&Q); for (int i = n; i > 0; i--) { enQueue(Q, i); } int count = 0; while (Q->next != Q) { int data = deQueue(Q); count++; if (count % m != 0) { enQueue(Q, data); } else { printf("%d ", data); } } printf("\n"); free(Q); } int main() { int n, m; printf("Please enter the number of people and the number to count: "); scanf("%d%d", &n, &m); josephus(n, m); return 0; } ``` 在上面的代码中,我们使用了一个循环链表来模拟队列,并实现队列的基本操作:初始化、入队、出队。在 `josephus` 函数中,我们先把所有人入队,然后进行循环,每次出队并计数,如果计数不到 `m`,就把这个人再次入队,否则就打印出这个人的编号。最后,当队列中只剩下一个人时,循环结束。 你可以尝试运行上面的代码,输入人数和每次要数的数字,看看约瑟夫环的结果是什么。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值